home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
dskut
/
diskread.zip
/
DISKREAD.BAS
next >
Wrap
BASIC Source File
|
1987-07-14
|
24KB
|
836 lines
' DISKREAD: A program to read absolute hard disk sectors and
' display the data. It will NOT write to the drive.
'
' Copyright 1986, 1987 Michael L. Brown
' Nicolet Instrument Corp
' 5225-2 Verona Rd
' PO Box 4288
' Madison, WI 53711-0288
'
' User is hereby granted permission to use said program. User is not
' allowed to sell said program. User may include said program with other
' programs, but may not charge extra for its inclusion.
'
' Source of said program may also be distributed. Please send any problems
' or code enhancements to the above address or electronically to:
' The NICBUL BBS system (608) 273-5037 6pm to 8am M-F
' All day S-S (CT)
' or via UUCP to ..!ihnp4!nicmad!brown
' ..!seismo!uwvax!nicmad!brown
'
' Version 1.2 November 4, 1986
' 1.3 March 16, 1987
' 1.4 6/24/87 Added main menu option 5: Copy complete disk
' from one drive to another.
' 1.5 7/14/87 Added copying multiple (sequential) sectors.
'
VER$="Version 1.5"
DISPLAY% = 1
DRIVE%=128
CYL%=0
HEAD%=0
SECTOR%=1
ACYL% = 0
BCYL% = 0
AHEAD% = 0
BHEAD% = 0
ASECTOR% = 1
BSECTOR% = 1
GOSUB READPARAM
IF AH% = 0 THEN
GOSUB COMPAREDRV
GOTO 10
END IF
LOCATE 3,1,0
PRINT "Error while trying to read drive 0 parameters."
PRINT "The hard disk controller board returned an error of:";AH%
LOCATE 10,1,0
END
'
' Clear the screen and set up the main menu
'
10 CLS
HPOS% = 20
GOSUB BOX
20 LOCATE 5,34,0
PRINT CHR$(181);
COLOR 0,7
PRINT " MAIN MENU ";
COLOR 7,0
PRINT CHR$(198);
30 LOCATE 6,22,0
PRINT "DISKREAD"
LOCATE 6,58-LEN(VER$),0
PRINT VER$
40 LOCATE 8,22,0
PRINT "F1 - Select Drive Parameters"
LOCATE 9,22,0
PRINT "F2 - Display Disk Partition Table"
LOCATE 10,22,0
PRINT "F3 - Read Drive Data"
LOCATE 11,22,0
PRINT "F4 - Copy Disk Sector"
IF DRIVESEQUAL% THEN
LOCATE 12,22,0
PRINT "F5 - Copy Entire Disk"
END IF
LOCATE 14,22,0
PRINT "ESC- Return To DOS"
GOSUB INFO
50 IF DRIVESEQUAL% THEN
MAXKEY% = 5
MAXFUNC% = 5
ELSE
MAXKEY% = 4
MAXFUNC% = 4
END IF
GOSUB READKEY
IF KEYVAL% = 27 THEN CLS :_
END
ON KEYVAL% GOTO 10000, _ 'Select Drive
20000, _ 'Display Partition Table
30000, _ 'Read Drive Data
40000, _ 'Copy Disk Sector
50000 'Copy Entire Disk
GOTO 50
'
'Select the parameters
'
10000 CLS
HPOS% = 20
GOSUB BOX
LOCATE 5,32,0
PRINT CHR$(181);
COLOR 0,7
PRINT " SELECT DRIVE ";
COLOR 7,0
PRINT CHR$(198)
10010 LOCATE 7,22,0
PRINT "F1 - Select First Hard Disk"
LOCATE 8,22,0
PRINT "F2 - Select Second Hard Disk"
LOCATE 9,22,0
PRINT "F3 - Select Disk Cylinder"
LOCATE 10,22,0
PRINT "F4 - Select Disk Head"
LOCATE 11,22,0
PRINT "F5 - Select Disk Sector"
LOCATE 14,22,0
PRINT "ESC - Return To Main Menu"
10020 MAXKEY% = 0
MAXFUNC% = 5
IF DRIVE% = 128 THEN _
ACYL% = CYL% :_
AHEAD% = HEAD% :_
ASECTOR% = SECTOR%
IF DRIVE% = 129 THEN _
BCYL% = CYL% :_
BHEAD% = HEAD% :_
BSECTOR% = SECTOR%
LOCATE 17,20,0
IF DRIVE% = 128 AND MAXDRV% = 2 THEN COLOR 15,0
PRINT "Drive: 0";" Cylinder:";
PRINT USING "#####";ACYL%;
PRINT " Head:";AHEAD%;" Sector:";
PRINT USING "###";ASECTOR%;
COLOR 7,0
IF MAXDRV% < 2 THEN 10030
IF DRIVE% = 129 THEN COLOR 15,0
LOCATE 18,20,0
PRINT "Drive: 1";" Cylinder:";
PRINT USING "#####";BCYL%;
PRINT " Head:";BHEAD%;" Sector:";
PRINT USING "###";BSECTOR%;
COLOR 7,0
10030 GOSUB INFO
GOSUB READKEY
IF KEYVAL% = 27 THEN 10
IF KEYVAL% < 3 AND MAXDRV% = 2 THEN DRIVE% = KEYVAL%-1+128 :_
GOSUB READPARAM :_
IF DRIVE% = 128 THEN _
CYL% = ACYL% :_
HEAD% = AHEAD% :_
SECTOR% = ASECTOR%
IF DRIVE% = 129 THEN _
CYL% = BCYL% :_
HEAD% = BHEAD% :_
SECTOR% = BSECTOR%
IF KEYVAL% = 3 THEN LOCATE 22,1,1 :_
INPUT;"Enter Cylinder number: ",TMP%
IF KEYVAL% = 4 THEN LOCATE 22,1,1 :_
INPUT;"Enter Head number: ",TMP%
IF KEYVAL% = 5 THEN LOCATE 22,1,1 :_
INPUT;"Enter Sector number: ",TMP%
IF KEYVAL% = 3 AND TMP% <= MAXCYL% THEN CYL% = TMP%
IF KEYVAL% = 4 AND TMP% <= MAXHEAD% THEN HEAD% = TMP%
IF KEYVAL% = 5 AND TMP% <= MAXSEC% AND TMP% > 0 THEN SECTOR% = TMP%
LOCATE 22,1,0
PRINT SPACE$(40)
GOTO 10020
'
' Display the drive's partition table
'
20000 CLS
VPOS% = 1
HPOS% = 1
WASDRIVE% = DRIVE%
DRIVE% = 128
20010 GOSUB FBOX
IF DRIVE% = 128 THEN LOCATE 1,29 :_
PRINT CHR$(181); :_
COLOR 0,7 :_
PRINT " PARTITION INFORMATION "; :_
COLOR 7,0 :_
PRINT CHR$(198);
LOCATE VPOS%+1,HPOS%+36
PRINT "DRIVE";DRIVE%-128
LOCATE VPOS%+2,HPOS%
PRINT CHR$(199);
FOR L = 1 TO 78
PRINT CHR$(196);
NEXT
PRINT CHR$(182);
GOSUB READPARAM
IF AH% = 0 THEN 20020
LOCATE VPOS%+9,HPOS%+22
PRINT "Error ";HEX$(AH%);" while reading drive parameters";
GOTO 20100
20020 CYL% = 0
HEAD% = 0
SECTOR% = 1
AH% = 2
GOSUB CALLINT
DEF SEG = ES%
IF PEEK(BX%+510) = &H55 AND PEEK(BX%+511) = &HAA THEN 20030
LOCATE VPOS%+9,HPOS%+27
PRINT "This disk is not partitioned"
GOTO 20100
20030 LOCATE VPOS%+3,HPOS%+2
PRINT "# SYS TYPE START END SIZE BYTES";
PRINT " REL. SEC. OFFSET NUMBER SECTORS";
PART% = BX%+&H1BE
FOR VPOS% = VPOS%+5 TO VPOS%+8
BOOT% = PEEK(PART%)
BEGHEAD% = PEEK(PART%+1)
BEGSEC% = PEEK(PART%+2)
BEGCYL% = PEEK(PART%+3)+((BEGSEC% AND &HC0)*4)
BEGSEC% = BEGSEC% AND &H3F
SYSIND% = PEEK(PART%+4)
ENDHEAD% = PEEK(PART%+5)
ENDSEC% = PEEK(PART%+6)
ENDCYL% = PEEK(PART%+7)+((ENDSEC% AND &HC0)*4)
ENDSEC% = ENDSEC% AND &H3F
RELSEC# = PEEK(PART%+8)+(PEEK(PART%+9)*256#)+(PEEK(PART%+10)*65536#)
RELSEC# = RELSEC# +(PEEK(PART%+11)*16777216#)
NUMSEC# = PEEK(PART%+12)+(PEEK(PART%+13)*256#)+(PEEK(PART%+14)*65536#)
NUMSEC# = NUMSEC# +(PEEK(PART%+15)*16777216#)
LOCATE VPOS%,HPOS%+1
IF DRIVE% = 128 THEN PRINT VPOS%-5;
IF DRIVE% = 129 THEN PRINT VPOS%-17;
IF NUMSEC# = 0 THEN 20040
IF SYSIND% = &H01 OR SYSIND% = &H04 THEN PRINT "DOS "; _
ELSE PRINT " ";
IF BOOT% = &H80 THEN PRINT " A "; _
ELSE PRINT " ";
PRINT USING "######";BEGCYL%;ENDCYL%;
PRINT USING "#######";ENDCYL%-BEGCYL%+1;
PRINT USING "###,###,###";NUMSEC# * 512;
PRINT USING "######,###,###,###";RELSEC#;NUMSEC#;
20040 PART% = PART%+16
NEXT
IF MAXDRV% < 2 THEN 20100
IF DRIVE% = 129 THEN 20100
DRIVE% = 129
VPOS% = 13
GOTO 20010
20100 IF INKEY$ = "" THEN 20100
DRIVE% = WASDRIVE%
GOTO 10
'
' Read and display requested drive sector
'
30000 CLS
LOCATE 2,1,0
PRINT CHR$(201);
FOR L = 1 TO 78
PRINT CHR$(205);
NEXT
PRINT CHR$(187);
FOR L = 3 TO 24
LOCATE L,80,0